import { useCallback, useEffect, useRef } from 'react';

interface UseAccessibilityProps {
  /** 是否启用键盘导航 */
  enableKeyboardNavigation?: boolean;
  /** 是否启用屏幕阅读器支持 */
  enableScreenReader?: boolean;
  /** 是否启用焦点管理 */
  enableFocusManagement?: boolean;
  /** 组件的可访问性标签 */
  ariaLabel?: string;
  /** 组件的可访问性描述 */
  ariaDescription?: string;
  /** 当前状态的可访问性描述 */
  ariaValueText?: string;
}

interface AccessibilityHandlers {
  /** 键盘事件处理器 */
  handleKeyDown: (event: KeyboardEvent) => void;
  /** 获取 ARIA 属性 */
  getAriaProps: () => Record<string, string | number | boolean>;
  /** 焦点管理 */
  focusElement: () => void;
  /** 宣布状态变化 */
  announceChange: (message: string) => void;
  /** 设置元素引用 */
  setElementRef: (element: HTMLElement | null) => void;
}

/**
 * 可访问性支持 Hook
 *
 * 🎯 设计理念：
 * 1. 键盘导航：支持箭头键、Home/End、ESC 等标准键盘操作
 * 2. 屏幕阅读器：提供完整的 ARIA 属性和状态宣布
 * 3. 焦点管理：自动聚焦、焦点陷阱、焦点恢复
 * 4. 渐进增强：可访问性功能不影响基础功能使用
 *
 * 🎹 键盘交互映射：
 * - ↑/↓ 箭头键：在吸附点间切换
 * - Home/End：快速跳转到第一个/最后一个吸附点
 * - ESC：关闭弹框
 * - Tab/Shift+Tab：焦点陷阱，在弹框内循环
 *
 * 🔊 屏幕阅读器支持：
 * - ARIA 属性：role="dialog", aria-modal="true" 等
 * - 状态宣布：位置变化时自动宣布当前状态
 * - Live Region：动态内容更新通知
 *
 * 👁️ 焦点管理：
 * - 自动聚焦：弹框打开时自动聚焦到主元素
 * - 焦点陷阱：Tab 键在弹框内循环，不会跳出
 * - 焦点恢复：弹框关闭后恢复到触发元素
 *
 * 🌐 国际化考虑：
 * - 支持 RTL 布局
 * - 可配置的 ARIA 标签
 * - 多语言状态描述
 *
 * 提供键盘导航、屏幕阅读器支持、焦点管理等功能
 */
export const useAccessibility = ({
  enableKeyboardNavigation = true,
  enableScreenReader = true,
  enableFocusManagement = true,
  ariaLabel = '模态弹框',
  ariaDescription = '可拖拽的模态弹框，支持多个吸附点',
  ariaValueText = '',
}: UseAccessibilityProps = {}): AccessibilityHandlers => {
  const elementRef = useRef<HTMLElement | null>(null);
  const announcementRef = useRef<HTMLDivElement | null>(null);

  // 创建屏幕阅读器公告区域
  useEffect(() => {
    if (!enableScreenReader) return;

    // 创建隐藏的公告区域
    const announcement = document.createElement('div');
    announcement.setAttribute('aria-live', 'polite');
    announcement.setAttribute('aria-atomic', 'true');
    announcement.style.position = 'absolute';
    announcement.style.left = '-10000px';
    announcement.style.width = '1px';
    announcement.style.height = '1px';
    announcement.style.overflow = 'hidden';

    document.body.appendChild(announcement);
    announcementRef.current = announcement;

    return () => {
      if (announcement.parentNode) {
        announcement.parentNode.removeChild(announcement);
      }
    };
  }, [enableScreenReader]);

  // 键盘事件处理
  const handleKeyDown = useCallback(
    (event: KeyboardEvent) => {
      if (!enableKeyboardNavigation) return;

      switch (event.key) {
        case 'Escape':
          // ESC 键关闭弹框
          event.preventDefault();
          announceChange('弹框已关闭');
          break;

        case 'ArrowUp':
          // 上箭头：移动到上一个吸附点
          event.preventDefault();
          announceChange('向上移动');
          break;

        case 'ArrowDown':
          // 下箭头：移动到下一个吸附点
          event.preventDefault();
          announceChange('向下移动');
          break;

        case 'Home':
          // Home 键：移动到第一个吸附点
          event.preventDefault();
          announceChange('移动到顶部');
          break;

        case 'End':
          // End 键：移动到最后一个吸附点
          event.preventDefault();
          announceChange('移动到底部');
          break;

        case 'Enter':
        case ' ':
          // 回车或空格：确认当前位置
          event.preventDefault();
          announceChange('位置已确认');
          break;

        case 'Tab':
          // Tab 键：焦点管理（不阻止默认行为）
          break;

        default:
          break;
      }
    },
    [enableKeyboardNavigation]
  );

  // 获取 ARIA 属性
  const getAriaProps = useCallback(() => {
    const props: Record<string, string | number | boolean> = {};

    if (enableScreenReader) {
      props['aria-label'] = ariaLabel;
      props['aria-description'] = ariaDescription;
      props['role'] = 'dialog';
      props['aria-modal'] = true;
      props['tabIndex'] = -1;

      if (ariaValueText) {
        props['aria-valuetext'] = ariaValueText;
      }

      // 添加键盘操作说明
      props['aria-describedby'] = 'modal-sheet-instructions';
    }

    return props;
  }, [enableScreenReader, ariaLabel, ariaDescription, ariaValueText]);

  // 焦点管理
  const focusElement = useCallback(() => {
    if (!enableFocusManagement || !elementRef.current) return;

    // 延迟聚焦，确保元素已渲染
    setTimeout(() => {
      if (elementRef.current) {
        elementRef.current.focus();
      }
    }, 100);
  }, [enableFocusManagement]);

  // 宣布状态变化
  const announceChange = useCallback(
    (message: string) => {
      if (!enableScreenReader || !announcementRef.current) return;

      // 清空后设置新消息，确保屏幕阅读器读取
      announcementRef.current.textContent = '';
      setTimeout(() => {
        if (announcementRef.current) {
          announcementRef.current.textContent = message;
        }
      }, 10);
    },
    [enableScreenReader]
  );

  // 设置元素引用
  const setElementRef = useCallback((element: HTMLElement | null) => {
    elementRef.current = element;
  }, []);

  return {
    handleKeyDown,
    getAriaProps,
    focusElement,
    announceChange,
    setElementRef,
  };
};
